package top.lixunda.ecommerce.server.user.api.entity.dto;

import lombok.Data;
import lombok.EqualsAndHashCode;
import top.lixunda.ecommerce.server.user.api.entity.db.UserInfoDO;
import top.lixunda.common.validate.annotation.XumBetween;
import top.lixunda.common.validate.annotation.XumDefaultToNull;
import top.lixunda.common.validate.annotation.XumRegex;

import java.time.LocalDate;

/**
 * @author Xumda
 * @version time:2019/12/13 17:09
 * <p>
 * 更新当前用户基本信息，这里的基本信息不能进行登录等操作，所以不需要验证
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class UserInfoChgDTO {

    /**
     * First Name
     */
    @XumBetween(min = 1, max = 4)
    @XumDefaultToNull
    private String firstName;

    /**
     * Last Name
     */
    @XumBetween(min = 1, max = 16)
    @XumDefaultToNull
    private String lastName;

    /**
     * 昵称 3-16 个字符
     */
    @XumBetween(min = 3, max = 6)
    @XumDefaultToNull
    private String nickname;

    /**
     * 生日，格式yyyy-MM-dd
     */
    @XumDefaultToNull
    private String birthday;

    /**
     * 身份证号
     */
    @XumDefaultToNull
    private String idNumber;

    /**
     * QQ
     */
    @XumRegex("^[1-9][0-9]{4,11}$")
    @XumDefaultToNull
    private String qq;

    /**
     * 手机号码
     */
    @XumDefaultToNull
    private String phone;

    /**
     * email邮箱地址
     */
    @XumDefaultToNull
    private String email;

    /**
     * 微信号
     */
    @XumDefaultToNull
    private String weChat;

    /**
     * 转换成UserInfoDO
     *
     * @return UserInfoDO
     */
    public UserInfoDO toUserInfo() {
        UserInfoDO userInfo = new UserInfoDO();
        userInfo.setFirstName(this.firstName);
        userInfo.setLastName(this.lastName);
        userInfo.setNickname(this.nickname);
        userInfo.setBirthday(this.birthday == null ? null : LocalDate.parse(this.birthday));
        userInfo.setIdNumber(this.idNumber);
        userInfo.setQq(this.qq);
        userInfo.setPhone(this.phone);
        userInfo.setEmail(this.email);
        userInfo.setWeChat(this.weChat);
        return userInfo;
    }


    /**
     * 判断是否存在更新数据，若所有可以更新的字段为空，则表示无更新数据，此时传到到atomic进行更新会报错
     *
     * @return true 存在更新数据 false 不存在更新数据，此时不进行更新操作
     */
    public boolean haveUpdateData() {
        return (this.firstName != null || this.lastName != null || this.nickname != null || this.birthday != null
                || this.idNumber != null || this.qq != null || this.phone != null || this.email != null
                || this.weChat != null);
    }

}
